/**
 * @(#)ControllerInterceptor.java
 * Description: 控制层拦截器
 * Version :    0.0.0
 * Copyright:   Copyright (c)
 * Create by:   w15579  2017年9月25日
 */
package com.zn.kjj.util.intercepor;


import org.apache.catalina.servlet4preview.http.HttpServletRequest;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

/**
 * @ClassName: ControllerInterceptor
 * @Description: 控制层拦截器
 * @author w15579
 * @date. 2017年9月25日
 * @version v1.0.0
 */
@Aspect
@Component
public class ControllerInterceptor {
    private static final Logger logger = LoggerFactory.getLogger(ControllerInterceptor.class);
    @Pointcut("execution(* com.hytera.mrps.controller..*(..)) and @annotation(org.springframework.web.bind.annotation.RequestMapping)")
    public void controllerMethonPointcut(){}
    /**
     * 拦截所有请求
     * @Title: Interceptor
     * @Description: 拦截所有请求
     * @param pjp 切点
     * @return 参数说明
     * @since v1.0.0
     */
    @Around("controllerMethonPointcut()")
    public Object interceptor(ProceedingJoinPoint pjp){
        long beginTime = System.currentTimeMillis();
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Method method = signature.getMethod(); //获取被拦截的方法
        String methodName = method.getName(); //获取被拦截的方法名
        
        Set<Object> allParams = new LinkedHashSet<>(); //保存所有请求参数，用于输出到日志中
        
        logger.info("请求开始，方法：{}", methodName);
        
        Object result = null;

        Object[] args = pjp.getArgs();
        for(Object arg : args){
            //logger.debug("arg: {}", arg);
            if (arg instanceof Map<?, ?>) {
                //提取方法中的MAP参数，用于记录进日志中
                @SuppressWarnings("unchecked")
                Map<String, Object> map = (Map<String, Object>) arg;

                allParams.add(map);
            }else if(arg instanceof HttpServletRequest){
                HttpServletRequest request = (HttpServletRequest) arg;
//                if(isLoginRequired(method)){
//                    if(!isLogin(request)){
//                        result = new JsonResult(ResultCode.NOT_LOGIN, "该操作需要登录！去登录吗？\n\n", null);
//                    }
//                }
                
                //获取query string 或 posted form data参数
                Map<String, String[]> paramMap = request.getParameterMap();
                if(paramMap!=null && paramMap.size()>0){
                    allParams.add(paramMap);
                }
            }else if(arg instanceof HttpServletResponse){
                //do nothing...
            }else{
                //allParams.add(arg);
            }
        }
        
        try {
            if(result == null){
                // 一切正常的情况下，继续执行被拦截的方法
                result = pjp.proceed();
            }
        } catch (Throwable e) {
            logger.info("exception: ", e);
//            result = new JsonResult(ResultCode.EXCEPTION, "发生异常："+e.getMessage());
        }
        
//        if(result instanceof JsonResult){
//            long costMs = System.currentTimeMillis() - beginTime;
//            logger.info("{}请求结束，耗时：{}ms", methodName, costMs);
//        }
        
        return result;
    }
}
